/*
Eteria IRC Client, an RFC 1459 compliant client program written in Java.
Copyright (C) 2000-2001  Javier Kohen <jkohen at tough.com>

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

import java.awt.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.MessageFormat;
import java.text.ParseException;
import java.util.*;
import ar.com.jkohen.awt.ChatPanel;
import ar.com.jkohen.awt.MircSmileyTextArea;
import ar.com.jkohen.irc.Channel;
import ar.com.jkohen.irc.MircMessage;
import ar.com.jkohen.util.Resources;
import ar.com.jkohen.util.ConfigurationProperties;
import com.splendid.awtchat.*;

public abstract class OutputWindow extends ChatPanel implements HyperlinkReceiver, Observer, CopyText
{
    protected MircSmileyTextArea text_canvas;

	protected boolean hyperlinks = true;
    private Resources res;

    protected static final MessageFormat INFO = new MessageFormat(Resources.getString("msg.info"));
    protected static final MessageFormat ERROR = new MessageFormat(Resources.getString("msg.error"));
    protected static final MessageFormat NOTICE	= new MessageFormat(Resources.getString("msg.notice"));
    protected static final MessageFormat WARNING = new MessageFormat(Resources.getString("msg.warning"));
    
    protected static final MessageFormat SERV_NOTICE = new MessageFormat(Resources.getString("msg.serv_notice"));
    protected static final MessageFormat STRIP_NOTICE = new MessageFormat(Resources.getString("msg.strip_notice"));

    public OutputWindow(String title)
	{
		super(title);
		text_canvas = new MircSmileyTextArea(this, this);
    }

    public void update(Observable o, Object arg)
    {
		ConfigurationProperties props = (ConfigurationProperties) o;

		if (arg == null || arg.equals("scroll_speed"))
	    	text_canvas.setMode(props.getInt("scroll_speed"));
    }

	public void clear()
	{
		text_canvas.clear();
	}
		
    /* High level methods.
     */
	 
    public void printError(String s)
	{
		Object [] o = { s };
		text_canvas.append(ERROR.format(o));

		postTextEvent();
    }

    public void printInfo(String s)
    {
		Object [] o = { s };
		text_canvas.append(INFO.format(o));
		
		postTextEvent();
    }

    public void printWarning(String s)
    {
		Object [] o = { s };
		text_canvas.append(WARNING.format(o));

		postTextEvent();
    }

    public void printNotice(String s, String whom)
    {
		Object [] o = { whom, s };
		if (hyperlinks)
			text_canvas.append(NOTICE.format(o));
		else
			text_canvas.appendNoUrls(NOTICE.format(o));

		postTextEvent();
    }
	
    public void printServerNotice(String s, String whom)
    {
    	try
    	{
    		Object o[] = STRIP_NOTICE.parse(s);
    		if (o[0] != null || !o[0].equals(""))
    			s = o[0].toString();
    	}
    	catch (ParseException ex) {}
    		    	
		Object [] obj = { whom, s };
		text_canvas.append(SERV_NOTICE.format(obj));

		postTextEvent();
    }
    
    /* Low level methods.
     */
     
    public void output(String s)
    {
		text_canvas.append(s);

		postTextEvent();
    }

    public void setFont(Font f)
    {
		super.setFont(f);
		text_canvas.setFont(f);
    }

    public void handleHyperlink(String link)
    {
		if (Channel.isChannel(link))
		{
		    joinChannel(link);
 		}
 		else
 		{
	 	   try
	 	   {
				visitURL(new URL(link));
	 	   }
	 	   catch (MalformedURLException e)
	 	   {
				printError(res.getString("eirc.not_an_url"));
	 	   }
		}
    }

    public void handleNick(String nick)
    {
	    talkTo(nick);
    }
	
	public void addText(String s)
    {
	    copyText(s);
    }
	
    /* Send nickname string to channel messages textfield. */
    protected abstract void talkTo(String nick);
    
    /* Makes the client join the specified Channel. */
    protected abstract void joinChannel(String name);

    /* Makes the browser visit the specified URL. */
    protected abstract void visitURL(URL url);
	
	/* Open Cute-paste window */
    protected abstract void copyText(String s);
}
